package com.fxu.framework.mq.redis.simple;

import com.fxu.framework.core.redis.RedisConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 消息队列配置类
 * 只试用于针对消息不是很严谨情况
 * 不能关闭 redis.conf 的 save 保存本地
 * @author fangxu
 */
@Slf4j
@Component
//@EnableScheduling // 启用定时任务，用于 RedisMessageResendJob 重发消息
@AutoConfigureAfter(RedisConfig.class)
public class RedisMqConfig {

    @Bean
    public RedisMqTemplate redisMQTemplate(StringRedisTemplate redisTemplate,
                                           List<RedisMqInterceptor> interceptors) {
        RedisMqTemplate redisMQTemplate = new RedisMqTemplate(redisTemplate);
        log.debug("redisMQTemplate=>{}", redisTemplate);
        // 添加拦截器
        interceptors.forEach(redisMQTemplate::addInterceptor);
        return redisMQTemplate;
    }

    /**
     * 创建 Redis Pub/Sub 广播消费的容器x
     * @param redisMQTemplate redisMQ模版
     * @param listeners 监听对象集合
     * @return Redis消息监听容器
     */
    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(
            RedisMqTemplate redisMQTemplate, List<RedisMqListener<?>> listeners) {
        // 创建 RedisMessageListenerContainer 对象
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        // 设置 RedisConnection 工厂。
        container.setConnectionFactory(redisMQTemplate.getRedisTemplate().getRequiredConnectionFactory());
        // 添加监听器
        listeners.forEach(listener -> {
            listener.setRedisMQTemplate(redisMQTemplate);
            container.addMessageListener(listener, new ChannelTopic(listener.getChannel()));
            log.info("[RedisMqListenerContainer][注册 Channel({}) 对应的监听器({})]",
                    listener.getChannel(), listener.getClass().getName());
        });
        return container;
    }

//    /**
//     * 校验 Redis 版本号，是否满足最低的版本号要求！
//     */
//    private static void checkRedisVersion(RedisTemplate<String, ?> redisTemplate) {
//        // 获得 Redis 版本
//        Properties info = redisTemplate.execute((RedisCallback<Properties>) RedisServerCommands::info);
//        String version = MapUtil.getStr(info, "redis_version");
//        log.debug("redis version = {}", version);
//        // 校验最低版本必须大于等于 5.0.0
//        int majorVersion = Integer.parseInt(StrUtil.subBefore(version, '.', false));
//        if (majorVersion < 5) {
//            throw new IllegalStateException(StrUtil.format("您当前的 Redis 版本为 {}，小于最低要求的 5.0.0 版本！" +
//                    "请进行安装。", version));
//        }
//    }

}
